#ifndef __JSON_OPERATE_H__
#define __JSON_OPERATE_H__

#include <string>

#include "JsonPath/JsonPath.h"
#include "Poco/JSON/Object.h"
#include "Poco/Mutex.h"

// 可以根据token获取某一个对象，Pair方式也行

class JsonOperate
{
public:
    JsonOperate();

public:
    Poco::Dynamic::Var Get(std::string strJsonPath);
    int Set(std::string strJsonPath, Poco::Dynamic::Var var);
    int Add(std::string strJsonPath, Poco::Dynamic::Var var);
    int Del(std::string strJsonPath);

private:
    enum JsonOperateType
    {
        JsonOperateType_Get,
        JsonOperateType_Set,
        JsonOperateType_Add,
        JsonOperateType_Del,
        JsonOperateType_Max
    };
    Poco::Dynamic::Var Operate(JsonOperateType eOpt, std::string strJsonPath, Poco::Dynamic::Var var = Poco::Dynamic::Var());

public:
    int SetObject(Poco::JSON::Object::Ptr& pObjOrigin, Poco::JSON::Object::Ptr pObjNew);

private:
    int GetNext(Poco::JSON::Object::Ptr& pObj, Poco::JSON::Array::Ptr& pArr, std::string strKey);
    int Trace(JsonPath jsonPath, Poco::JSON::Object::Ptr& pObj, Poco::JSON::Array::Ptr& pArr);
    int Walk(Poco::JSON::Object::Ptr& pObj, Poco::JSON::Array::Ptr& pArr, JsonPath subJsonPath);
    int Recursion(Poco::JSON::Object::Ptr& pObj, Poco::JSON::Array::Ptr& pArr, JsonPath subJsonPath);
    void Reset();

protected:
    bool m_bInit;

protected:
    Poco::Mutex m_mutex;
    Poco::JSON::Object::Ptr m_pObj;

private:
    JsonOperateType m_eOperateType;
    enum JsonOperateResultType
    {
        JsonOperateResultType_Var,
        JsonOperateResultType_JsonObj,
        JsonOperateResultType_JsonArr,
        JsonOperateResultType_Max,
    };
    JsonOperateResultType m_eResultType;
    Poco::JSON::Object::Ptr m_pJsonObjTemp;
    Poco::JSON::Array::Ptr m_pJsonArrTemp;
    Poco::Dynamic::Var m_varTemp;
};

#endif //__JSON_OPERATE_H__